/*-------------------------------------------------------------------------
 *
 * 前端代码查询数据库的功能。
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/fe_utils/query_utils.c
 *
 *-------------------------------------------------------------------------
 */
#include "postgres_fe.h"

#include "common/logging.h"
#include "fe_utils/cancel.h"
#include "fe_utils/query_utils.h"

/*
 * 运行查询，返回结果，失败时退出程序。
 */
PGresult * executeQuery(PGconn *fc_conn, const char *fc_query, bool fc_echo)
{
	PGresult   *fc_res;

	if (fc_echo)
		printf("%s\n", fc_query);

	fc_res = PQexec(fc_conn, fc_query);
	if (!fc_res ||
		PQresultStatus(fc_res) != PGRES_TUPLES_OK)
	{
		pg_log_error("query failed: %s", PQerrorMessage(fc_conn));
		pg_log_error_detail("Query was: %s", fc_query);
		PQfinish(fc_conn);
		exit(1);
	}

	return fc_res;
}


/*
 * SQL命令的上述内容（不返回任何内容）。
 */
void executeCommand(PGconn *fc_conn, const char *fc_query, bool fc_echo)
{
	PGresult   *fc_res;

	if (fc_echo)
		printf("%s\n", fc_query);

	fc_res = PQexec(fc_conn, fc_query);
	if (!fc_res ||
		PQresultStatus(fc_res) != PGRES_COMMAND_OK)
	{
		pg_log_error("query failed: %s", PQerrorMessage(fc_conn));
		pg_log_error_detail("Query was: %s", fc_query);
		PQfinish(fc_conn);
		exit(1);
	}

	PQclear(fc_res);
}


/*
 * SQL维护命令的上述内容（返回命令成功）。
 * 命令在设置了取消处理程序的情况下执行，因此可以
 * 使用Ctrl-C中断它。
 */
bool executeMaintenanceCommand(PGconn *fc_conn, const char *fc_query, bool fc_echo)
{
	PGresult   *fc_res;
	bool		fc_r;

	if (fc_echo)
		printf("%s\n", fc_query);

	SetCancelConn(fc_conn);
	fc_res = PQexec(fc_conn, fc_query);
	ResetCancelConn();

	fc_r = (fc_res && PQresultStatus(fc_res) == PGRES_COMMAND_OK);

	if (fc_res)
		PQclear(fc_res);

	return fc_r;
}
